//
//  SteveZView.m
//  02绘制基本图形2
//
//  Created by apple on 15-6-7.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#import "SteveZView.h"

@implementation SteveZView

- (void)drawRect:(CGRect)rect
{

    // 1. 获取 "图形上下文"
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES];

    UIBezierPath* path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:50 startAngle:0 endAngle:M_PI * 2 clockwise:NO];

    CGContextAddPath(ctx, path1.CGPath);
    CGContextAddPath(ctx, path.CGPath);

    // 默认填充模式: nonzero winding number rule(非零绕数规则)从左到右跨过, +1。从右到左跨过, -1。最后如果为0, 那么不填充, 否则填充
    CGContextDrawPath(ctx, kCGPathFill);
}

// 奇偶填充规则
- (void)test8
{
    // 1. 获取"图形上下文"
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 200, 100)];

    UIBezierPath* path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 150) radius:80 startAngle:0 endAngle:M_PI * 2 clockwise:1];

    UIBezierPath* path2 = [UIBezierPath bezierPathWithRect:CGRectMake(250, 30, 20, 200)];

    CGContextAddPath(ctx, path2.CGPath);
    CGContextAddPath(ctx, path1.CGPath);
    CGContextAddPath(ctx, path.CGPath);

    // 说明: 被覆盖过奇数次的点填充, 被覆盖过偶数次的点不填充
    // even 偶数
    // odd 奇数
    // 当一个点被覆盖的次数如果是奇数次，那么填充。如果被覆盖过偶数次，那么不填充。
    CGContextDrawPath(ctx, kCGPathEOFill);
}

// 设置线头样式、连接处样式
- (void)test7
{
    // 设置绘图状态（设置颜色、线宽、线头样式、设置线段连接处的样式）
    // 通过UIBezierPath 路径对象来绘制图形
    // 1. 获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建"路径对象"
    UIBezierPath* path = [[UIBezierPath alloc] init];

    // 3. 向路径对象中添加路径
    // 设置一个起点
    [path moveToPoint:CGPointMake(30, 30)];
    // 添加一条线段
    [path addLineToPoint:CGPointMake(100, 30)];
    // 再添加一条线段
    [path addLineToPoint:CGPointMake(100, 150)];

    // 移动到起点
    [path moveToPoint:CGPointMake(30, 200)];
    // 添加一条线段
    [path addLineToPoint:CGPointMake(150, 200)];

    // 4. 把路径对象添加到"图形上下文"中 (通过UIXxxx类型转换为CGXxxx类型)
    CGContextAddPath(ctx, path.CGPath);

    //--------------------------------------- 设置绘图状态的代码 ------------------
    // 1. 设置线宽
    CGContextSetLineWidth(ctx, 20);

    // 设置线头样式
    CGContextSetLineCap(ctx, kCGLineCapButt);
    // 设置线段连接处的样式
    CGContextSetLineJoin(ctx, kCGLineJoinBevel);

    [[UIColor yellowColor] set]; // 设置描边与填充都采用同一种颜色
    //--------------------------------------- 设置绘图状态的代码 ------------------
    // 5. 渲染
    CGContextDrawPath(ctx, kCGPathStroke);
}

// 设置颜色，线宽，3种不同填充模式
- (void)test6
{
    // 设置绘图状态（设置颜色、线宽、线头样式、设置线段连接处的样式）
    // 通过UIBezierPath 路径对象来绘制图形
    // 1. 获取图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建"路径对象"
    UIBezierPath* path = [[UIBezierPath alloc] init];

    // 3. 向路径对象中添加路径
    // 设置一个起点
    [path moveToPoint:CGPointMake(30, 30)];
    // 添加一条线段
    [path addLineToPoint:CGPointMake(100, 30)];
    // 再添加一条线段
    [path addLineToPoint:CGPointMake(100, 150)];
    // 到起点再连一条线
    [path addLineToPoint:CGPointMake(30, 30)];

    // 关闭路径
    //[path closePath];

    //    // 移动到起点
    //    [path moveToPoint:CGPointMake(30, 200)];
    //    // 添加一条线段
    //    [path addLineToPoint:CGPointMake(150, 200)];

    // 4. 把路径对象添加到"图形上下文"中 (通过UIXxxx类型转换为CGXxxx类型)
    CGContextAddPath(ctx, path.CGPath);

    //--------------------------------------- 设置绘图状态的代码 ------------------
    // 1. 设置线宽
    CGContextSetLineWidth(ctx, 20);
    // 2. 设置颜色
    //    [[UIColor blueColor] setStroke]; // 设置描边的颜色
    //    [[UIColor redColor] setFill]; // 设置填充的颜色

    [[UIColor yellowColor] set]; // 设置描边与填充都采用同一种颜色
    //--------------------------------------- 设置绘图状态的代码 ------------------
    // 5. 渲染
    // CGContextDrawPath(ctx, kCGPathStroke);
    //.CGContextDrawPath(ctx, kCGPathFill);
    CGContextDrawPath(ctx, kCGPathFillStroke); // 又描边，又填充
}

// 绘制圆环
- (void)test5
{
    // 圆环(方式二，绘制两个嵌套的实心圆)
    // 1.
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建路径对象
    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES];

    // 3.
    CGContextAddPath(ctx, path.CGPath);

    // 4. 渲染
    CGContextDrawPath(ctx, kCGPathFill);

    // 再绘制一个实心圆
    UIBezierPath* path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:60 startAngle:0 endAngle:M_PI * 2 clockwise:YES];
    // 指定颜色
    [[UIColor redColor] set];
    // 把新的路径，添加到上下文中
    CGContextAddPath(ctx, path1.CGPath);
    CGContextDrawPath(ctx, kCGPathFill);

    //--------------------------------------------------------------
    //    // 圆环(方式一，指定线宽的方式)
    //    // 1.
    //    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //
    //    // 2. 创建路径对象
    //    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(150, 150) radius:100 startAngle:0 endAngle:M_PI * 2 clockwise:YES];
    //
    //    // 3.
    //    CGContextAddPath(ctx, path.CGPath);
    //    // 设置线宽
    //    CGContextSetLineWidth(ctx, 10);
    //
    //    // 4.
    //    CGContextDrawPath(ctx, kCGPathStroke);
}

// 画弧
- (void)test4
{
    // 画弧
    // 1. 获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建路径对象
    // 圆心
    CGPoint centerP = CGPointMake(150, 150);
    CGFloat radius = 100;
    CGFloat start = 0;
    // 360° ==> 2π  =>  M_PI * 2
    // 180° ==> π  => M_PI
    // 90° ==> π * 0.5  => M_PI_2
    CGFloat end = M_PI_2;

    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:centerP radius:radius startAngle:start endAngle:end clockwise:YES];

    // 3. 把路径添加到上下文中
    CGContextAddPath(ctx, path.CGPath);

    // 4. 渲染
    CGContextDrawPath(ctx, kCGPathStroke);
}

// 椭圆
- (void)test3
{

    // 椭圆
    // 1. 获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建路径对象
    UIBezierPath* path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 150, 150)];

    // 3. 把路径添加到上下文中
    CGContextAddPath(ctx, path.CGPath);

    // 4. 渲染
    CGContextDrawPath(ctx, kCGPathStroke);
}

// 圆角矩形
- (void)test2
{
    // 圆角矩形
    // 1. 获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 2. 创建路径对象
    UIBezierPath* path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(30, 30, 150, 150) cornerRadius:30];

    // 3. 把路径添加到上下文中
    CGContextAddPath(ctx, path.CGPath);

    // 4. 渲染
    CGContextDrawPath(ctx, kCGPathStroke);
}

// 矩形
- (void)test1
{
    // 矩形
    // 1. 获取当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    // 2. 创建路径对象
    UIBezierPath* path = [UIBezierPath bezierPathWithRect:CGRectMake(30, 30, 150, 80)];

    // 3. 添加子路径

    // 4. 把路径对象添加到上下文中
    CGContextAddPath(ctx, path.CGPath);

    // 5. 渲染
    //CGContextDrawPath(ctx, kCGPathStroke); // 空心
    CGContextDrawPath(ctx, kCGPathFill); // 实心
}

@end
